//
// Created by fairy on 2025/3/1 23:47.
//
#ifndef LED_H
#define LED_H


#include<zq_conf.h>

// 定义指示灯寄存器地址和寄存器类型
#define LED_BASE (*((volatile unsigned int *)0x400001))

namespace bsp
{

    namespace impl_led
    {
        namespace detail
        {
            DECLARE_MEMORY_REGION(LED, 0x400001);

            DECLARE_ATTRIBUTE(pin,
                              LED_1 = 0x0000,
                              LED_2 = 0x0001,
                              LED_3 = 0x0002,
                              LED_4 = 0x0003
            );
        }



        class LEDAll
        {
        public:
            INLINE void clearAll()
            {
                detail::LED::clear();
            }

            INLINE void onAll()
            {
                detail::LED::write(0x000F);
            }

            /**
             * 直接向LED里写入值
             * @param value 值
             */
            INLINE void write(const uint16_t value)
            {
                detail::LED::write(value);
            }
        };


        template<detail::pin::Type pin>
        class LED
        {
        public:
            /**
             * @brief 点亮灯，可以把多个灯用或操作同时点亮
             */
            INLINE void on()
            {
                detail::LED::write(pin, true);
            }

            /**
             * @brief 熄灭灯，可以把多个灯用或操作同时熄灭
             */
            INLINE void off()
            {
                detail::LED::clear(pin);
            }



            INLINE void toggle()
            {
                detail::LED::toggle(pin);
            }

            INLINE void clear()
            {
                detail::LED::clear(pin);
            }


        };
    }

    typedef impl_led::LEDAll led;// 把LED作为一个整体
    typedef impl_led::LED<impl_led::detail::pin::LED_1> led1;
    typedef impl_led::LED<impl_led::detail::pin::LED_2> led2;
    typedef impl_led::LED<impl_led::detail::pin::LED_3> led3;
    typedef impl_led::LED<impl_led::detail::pin::LED_4> led4;
}


#endif //LED_H
